const url = require('url')
const Layer = require('./layer')
const Route = require('./route')

function Router(){
    this.stack = [
        // {
        //     method:"all",//所以方法都可以匹配到
        //     pathname:'*', //所有路径都能匹配到
        //     handler(req,res){
        //         res.end(`cannot  ${req.method} ${req.url}`)
        //     }
        // }
    ]
}
Router.prototype.get = function(pathname,handlers){
    // this.stack.push({
    //     method:"get",
    //     pathname,
    //     handler
    // })
    const route = new Route()
    const layer = new Layer(pathname,route.dispatch.bind(route)) //创建一个layer
    layer.route = route //标识每一个路由配置一个路由实例
    this.stack.push(layer)
    
    route.get(handlers) 
    // console.log('out',this.stack) 
    // 外层的stack  存的是 路径对应的dispatch方法
    // 里层的stack  存的是 用户的回调
    // 稍后匹配的时候 会执行dispatch方法，执行里层对应的用户回调
}
Router.prototype.handle = function(req,res,out){
    let {pathname} = url.parse(req.url)
    let method = req.method.toLowerCase()
    // for (let i = 0; i < this.stack.length; i++) {
    //     let {method:routeMethod,pathname:routePath,handler} = this.stack[i]
    //     if(pathname === routePath && method === routeMethod) {
    //         return handler(req,res)
    //     }
    // }
    // out()
    // 请求带来后迭代外层的stack
    let idx = 0
    const  next = ()=>{ //先执行第一个，将第二个执行逻辑传入到dispatch中，dispatch调用此回调就从第一个走到第二个
        if(idx >= this.stack.length) return out()
        let layer = this.stack[idx++]
        if(layer.path === pathname){
            layer.handler(req,res,next)
        }else{
            next()
        }
    }
    next()  
    
    // this.stack[0].handler(req,res)
}
module.exports = Router


// 1） 创建应用会有一个路由系统 （存放的是一层层的）  每一层中存放的 是路径和方法
// 2)  路由系统中的每一层我们都提供一个Route的实例 ， layer.route = new Route
// 3) Route是一个类，每一个路由都有这个实例，实例中会创造一个stack， 用来存放用户注册的回调 （我们把存的回调也封装成layer） 里面的layer不需要在意路径
// 每一个layer需要存放方法 
// 外层的stack 需要匹配路径  ， 里层stack 需要匹配方法